package log

import (
	"context"
	"errors"
	"log/slog"
	"time"

	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// LogMode
//
//	@receiver l
//	@param _
//	@return logger.Interface
func (l Logger) LogMode(_ logger.LogLevel) logger.Interface {
	return l
}

// Info
//
//	@receiver l
//	@param ctx
//	@param msg
//	@param data
func (l Logger) Info(ctx context.Context, msg string, data ...interface{}) {
	slog.InfoContext(ctx, msg, data...)
}

// Warn
//
//	@receiver l
//	@param ctx
//	@param msg
//	@param data
func (l Logger) Warn(ctx context.Context, msg string, data ...interface{}) {
	slog.WarnContext(ctx, msg, data...)
}

// Error
//
//	@receiver l
//	@param ctx
//	@param msg
//	@param data
func (l Logger) Error(ctx context.Context, msg string, data ...interface{}) {
	slog.ErrorContext(ctx, msg, data...)
}

// Trace
//
//	@receiver l
//	@param ctx
//	@param begin
//	@param fc
//	@param err
func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
	// 获取运行时间
	elapsed := time.Since(begin)
	// 获取 SQL 请求和返回条数
	sql, rows := fc()

	// 通用字段
	logFields := []any{
		slog.String("sql", sql),
		slog.String("time", elapsed.String()),
		slog.Int64("rows", rows),
	}

	// Gorm 错误
	if err != nil {
		// 记录未找到的错误使用 warning 等级
		if errors.Is(err, gorm.ErrRecordNotFound) {
			slog.Warn("Database ErrRecordNotFound", logFields...)
		} else {
			// 其他错误使用 error 等级
			logFields = append(logFields, slog.Any("error", err))
			slog.Error("Database Error", logFields...)
		}
	}

	// 慢查询日志
	if l.SlowThreshold != 0 && elapsed > l.SlowThreshold {
		slog.Warn("Database Slow Log", logFields...)
	}

	// 记录所有 SQL 请求
	slog.Debug("Database Query", logFields...)
}
